#include "rotary_encoding.h"

u8 KUP;//旋钮锁死标志(1为锁死)
u16 cou;

void Rotary_Encoding_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);       
	GPIO_InitStructure.GPIO_Pin = JS_L_PIN|JS_D_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(JS_A_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = JS_R_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(JS_B_PORT,&GPIO_InitStructure);
}

u8 Rotary_Encoding_Read()
{
	u8 a = 0;//存放按键值
	u8 kt;
	
	if(GPIO_ReadInputDataBit(JS_A_PORT,JS_L_PIN))KUP=0;	//判断旋钮是否解除锁死
	if(!GPIO_ReadInputDataBit(JS_A_PORT,JS_L_PIN)&&KUP==0){ //判断是否旋转旋钮，同时判断是否有旋钮锁死
		delay_us(100);
		kt=GPIO_ReadInputDataBit(JS_B_PORT,JS_R_PIN);	//把旋钮另一端电平状态记录
		delay_ms(3); //延时
		if(!GPIO_ReadInputDataBit(JS_A_PORT,JS_L_PIN)){ //去抖
			if(kt==0){ //用另一端判断左或右旋转
				a=1;//右转
			}else{
				a=2;//左转
			}
			cou=0; //初始锁死判断计数器
			while(!GPIO_ReadInputDataBit(JS_A_PORT,JS_L_PIN)&&cou<60000){ //等待放开旋钮，同时累加判断锁死
				cou++;KUP=1;delay_us(20); //
			}
		}
	}
	if(!GPIO_ReadInputDataBit(JS_A_PORT,JS_D_PIN)&&KUP==0){ //判断旋钮是否按下  
		delay_ms(20);
		if(!GPIO_ReadInputDataBit(JS_A_PORT,JS_D_PIN)){ //去抖动
			a=3;//在按键按下时加上按键的状态值
			//while(ENCODER_D==0);	等等旋钮放开
		}
	}
	
	return a;
}
